package com.sisgesbyte.dao.proyeccion;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.ProyeccionClienteResponse;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.comun.GenericResponseEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionClienteEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantProyeccionClienteDaoImpl extends AbstractFacade<ProyeccionClienteEntity> implements MantProyeccionClienteDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantProyeccionClienteDaoImpl() {
		super(ProyeccionClienteEntity.class);
	}
	
	@Override
	public List<ProyeccionClienteEntity> listaProyeccionClientes( FiltrosSQLBean cadenaFiltros) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT pc.id, pc.cliente_id, pc.cliente_local_id,cl.cod_local,co.num_doc,co.tipo_identificacion_id,co.razon_social, ");
		jpql.append("co.nombre,co.apellido,cl.zona_id ,c.categoria_cliente_id canal_id, pc.periodo_id, pc.monto_proyectada,pc.codigo_banda  ");
		jpql.append("FROM proyeccion.proyeccion_cliente pc  ");
		jpql.append("inner join ventas.cliente c on pc.cliente_id = c.id ");
		jpql.append("inner join ventas.cliente_locales cl on pc.cliente_local_id = cl.id ");
		jpql.append("inner join comun.comun_objeto co  on c.comun_objeto_id = co.id  ");
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(),ProyeccionClienteEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<ProyeccionClienteEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericResponseEntity guardarProyeccionCliente( ProyeccionClienteResponse request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from proyeccion.sp_registrar_proyeccion_cliente(:in_cliente_id, :in_cliente_local_id, :in_periodo_id, :in_monto_proyectada, :in_codigo_banda)");
		Query query = em.createNativeQuery(jpql.toString(), GenericResponseEntity.class);
		query.setParameter("in_cliente_id", request.getClienteId());
		query.setParameter("in_cliente_local_id", request.getClienteLocalId());
		query.setParameter("in_periodo_id", request.getPeriodoId());
		query.setParameter("in_monto_proyectada", request.getMontoProyectado());
		query.setParameter("in_codigo_banda", request.getCodigoBanda());
		return (GenericResponseEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarProyeccionCliente( ProyeccionClienteResponse request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from proyeccion.sp_actualizar_proyeccion_cliente(:in_id,:in_cliente_id, :in_cliente_local_id, :in_periodo_id, :in_monto_proyectada, :in_codigo_banda)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", request.getId());
		query.setParameter("in_cliente_id", request.getClienteId());
		query.setParameter("in_cliente_local_id", request.getClienteLocalId());
		query.setParameter("in_periodo_id", request.getPeriodoId());
		query.setParameter("in_monto_proyectada", request.getMontoProyectado());
		query.setParameter("in_codigo_banda", request.getCodigoBanda());
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarProyeccionCliente(int codProyeccion) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from proyeccion.sp_registrar_proyeccion_cliente_detalle(:in_id)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", codProyeccion);
		return (GenericEntity) query.getSingleResult();
	}

}
